package com.casa_apoio.estoque.mode.dao;

import com.casa_apoio.estoque.mode.entity.Produto;
import com.casa_apoio.estoque.mode.entity.Saida;
import com.casa_apoio.model.dao.HibernateDAO;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

public class SaidaDAO<T> extends HibernateDAO<T> {

    public SaidaDAO(Class<T> classe, Session session) {
        super(classe, session);
    }

    public List<T> entradasNaoFinalizada() {
        Criterion filtro = Restrictions.eq("finalizado", false);
        Criteria criteria = criaCriteria();
        List<T> entradas = criteria.add(filtro).addOrder(Order.desc("dataMovimentacao")).list();
        return entradas;
    }

    public List<T> siadaPorData(Date date) {
        Criterion filtro = Restrictions.eq("data", date);
        Criteria criteria = criaCriteria();
        List<T> saidas = criteria.add(filtro).list();
        return saidas;
    }

    public List<Saida> listaSaidaProdutoPeriodo(Date dataInicio, Date dataFinal) {
        Criterion filtro = Restrictions.between("data", dataInicio, dataFinal);
        Criteria criteria = criaCriteria();
        List<Saida> saidas = criteria.add(filtro).addOrder(Order.asc("data")).addOrder(Order.asc("produto")).list();
        return saidas;
    }

    public List<Saida> listaSaidaProduto(Date dataInicio, Date dataFinal, Integer codigo) {
        Criterion filtro = Restrictions.between("data", dataInicio, dataFinal);
        Criteria criteria = criaCriteria();
        List<Saida> saidas = criteria.add(filtro).add(Restrictions.eq("produto.idProduto", codigo)).list();
        return saidas;
    }

    public List<Saida> listaSaidaProdutoPeriodo2(Date dataInicio, Date dataFinal) {
        Query query = (Query) criaQuery("from saida");
        List<Saida> saidas = query.list();
        return saidas;
    }
}
